/*
 * @Author: yuluo
 * @Date: 2025-07-01
 * @LastEditors: yuluo
 * @LastEditTime: 2025-09-06
 * @FilePath: \Projecte:\gitee\GD32F427\gd32-f427-BootLoader\App\inc\button.h
 * @Description:
 * 如有特殊注意事项请填写
 * Copyright (c) by ${yuluo}, All Rights Reserved.
 */

#ifndef __BUTTON_H
#define __BUTTON_H

#define key_ptr ((void *)0)

#define HIGHT 1
#define LOW 0

/* 单击和双击不能一起注册 */
/* 按键事件类型 */
typedef enum
{
    /* 按键按下 */
    BUTTON_EVENT_PRESS_DOWN,
    /* 按键释放 */
    BUTTON_EVENT_RELEASE,
    /* 按键单击 */
    BUTTON_EVENT_CLICK,
    /* 按键双击 */
    BUTTON_EVENT_DOUBLE_CLICK,
    /* 按键长按 */
    BUTTON_EVENT_LONG_PRESS,
    /* 按键超长按 */
    BUTTON_EVENT_VLONG_PRESS,
    /* 按键连按事件 */
    BUTTON_EVENT_CONTINUOS_PRESS
} ButtonEvent;

/* 可注册的事件类型 */
typedef enum
{
    /* 允许单击检测 */
    BUTTON_EVT_CLICK = 0x01,
    /* 允许双击检测 */
    BUTTON_EVT_DOUBLE_CLICK = 0x02,
    /* 允许长按 */
    BUTTON_EVT_LONG_PRESS = 0x04,
    /* 允许超长按 */
    BUTTON_EVT_VLONG_PRESS = 0x08,
    /* 允许连按触发 */
    BUTTON_EVT_CONTINUOS_PRESS = 0x10
} ButtonEventMask;

/* 按键回调原型 */
typedef void (*ButtonCallback)(unsigned char id, ButtonEvent e);

/* 用户配置结构体 */
typedef struct
{
    /* 按键id */
    unsigned char id;
    /* 按键电平读取函数 */
    unsigned char (*read_keyValue)(void);
    /* 触发电平 */
    unsigned char trigger_level;
    /* 注册的事件掩码 */
    unsigned char event_mask;
    /* 按键回调 */
    ButtonCallback button_cb;
} ButtonConfig;

/* 根据按键id查找按键 */
static ButtonConfig *Button_Found(uint8_t id);
/* 注册一个按键 */
void Button_Register(ButtonConfig *config);
/* 按键扫描 */
void Button_Scan(void);

#endif
